MENTAL, UN LENGUAJE
FORMAL DE
ESPECIFICACIÓN

“En el campo de la informática, el momento de la verdad es un programa al ejecutarse; todo lo demás es profecía” (Herbert Simon)



Concepto de especificación

La especificación de un sistema informática se ha asociado tradicionalmente a la tarea inicial que hay que realizar en todo proyecto software: la descripción de las características y funcionalidades del sistema a construir, así como las restricciones y limitaciones impuestas.

Lo que distingue a la especificación es el “qué”: lo que tiene que hacer el sistema. Las tareas subsiguientes de un proyecto (diseño, codificación y pruebas) se orientan al “cómo”, a la manera concreta de llevar a cabo las tareas descritas en la especificación.

Pero realmente la frontera entre el “qué” y el “cómo” es difusa, pues en el diseño, e incluso en la propia programación, hay también elementos especificadores, aunque a un mayor nivel de detalle. Lo que ocurre es que realmente todo es especificación y que el “qué” se convierte en “cómo” al aumentar el grado de detalle.

Los propios lenguajes de programación tienen aspectos especificadores. En efecto, la mayoría de ellos no establecen de forma clara la distinción entre el "qué" y el "cómo". Ambos aspectos se encuentran mezclados en la definición de cada lenguaje.

Es por ello que a veces se hace la distinción entre:
Propiedades de la especificación

En general, las especificaciones de un sistema deben tener las propiedades siguientes [Ince, 1988]:
  1. Precisión.
    Muchos sistemas se especifican habitualmente mediante lenguaje natural, de forma imprecisa y a menudo ambigua. De aquí el interés en una notación formal que evite la ambigüedad.

  2. Libre de directivas de diseño e implementación.
    Una especificación “pura” debe de estar libre de este tipo de referencias, que de existir restringirían el espacio de soluciones y la creatividad. Se dice que una especificación es abstracta si se especifica el comportamiento de un sistema sin considerar su implementación.

  3. Libre de detalle innecesario.
    La especificación debe poder expresar la esencia de las funcionalidades del sistema, sin que obligue a considerar detalles, que serán expresados en una fase posterior.

  4. Comprensible.
    La especificación debe ser clara e inteligible para poder obtener la aceptación por parte del cliente.

  5. Particionado.
    La especificación debe separarse en módulos que puedan examinarse con mínimas o nulas referencias a otros módulos. Se puede hablar de “especificación modular”.

Lenguajes de programación vs. Lenguajes de especificación La tabla siguiente resume estas y otras características. La flecha indica la tendencia (creciente o decreciente).

CaracterísticaLenguaje de
especificación
Lenguaje de
programación
SemánticaAltaBaja↑
Nivel de detalleBajo↑Alto
LegibilidadAltaBaja↑
FlexibilidadAltaBaja↑
PortabilidadSiempreNo siempre
Desarrollo de prototiposSiNo
MantenimientoFácilDifícil

Lenguajes de programación y de especificación tienden a converger, a unificarse, de tal forma que un sólo lenguaje puede servir para especificar un sistema o aplicación con el grado de detalle que se desee y que además sea ejecutable.


Lenguajes Formales de Especificación

La especificación de un sistema o aplicación se ha realizado de manera más o menos informal, pero siempre con el objetivo de organizar las ideas. Raras veces se ha utilizado una notación formal. Pero actualmente hay una línea de investigación orientada al uso de lenguajes formales de especificación, lo que implica la definición de una sintaxis y una semántica precisas.

Las especificaciones formales se han enfocado desde los puntos de vista:
  1. Operacional o imperativo.
    Se suministra un método constructivo.

  2. Descriptivo.
    Se suministra una lista de propiedades deseadas. Entre las formas descriptivas se encuentran las especificaciones algebraicas, las denotacionales y las axiomáticas.

  3. Mixto.
    Combina los dos aspectos anteriores.
Las representaciones de la especificación pueden clasificar en dos categorías: las de tipo gráfico y las de tipo textual. Entre las representaciones gráficas se encuentran: los diagramas Warnier-Orr, los diagramas de flujo de datos, los diagramas de transición de estados, etc. Hay representaciones que son híbridas (gráficas y textuales a la vez), como los diagramas HIPO, en el que se puede describir el proceso también de forma textual.

Los lenguajes formales de especificación utilizados han sido los siguientes:


Lenguaje natural

Es el más utilizado, pero tiene el problema de que es ambiguo. Para lograr una cierta precisión habría que usar las mismas palabras y la misma fraseología para describir los conceptos. Además existen dos problemas adicionales: 1) se dan por supuesto ciertos conocimientos en el lector (que no son precisos) y 2) las diferentes interpretaciones de las mismas palabras según las distintas culturas.


Pseudocódigo

Es una forma de especificar los procesos mediante el lenguaje natural pero haciendo uso, más o menos formalmente, de las estructuras básicas de la programación estructurada.

Con el pseudocódigo se posponen detalles de proceso, se mejora la comprensión del programa, pero:
Lenguajes de programación

Los lenguajes de programación suelen ser precisos, con lo que se cumple un importante requerimiento. Pero hay que distinguir entre:
  1. Lenguajes de tercera generación (3GL).
    Son básicamente de tipo operativo, por lo que la especificación había que darla principalmente en términos de un algoritmo (es decir, apoyarse en el "cómo"). Además el lenguaje de programación obliga a trabajar con información de detalle, con lo que se incumple un requerimiento de lo que debe ser una especificación.

  2. Lenguajes de cuarta generación (4GL).
    Estos lenguajes están cambiando la idea del término "lenguaje de programación", pues entre sus características están su forma próxima al lenguaje natural y ser de alguna forma descriptivos a la vez que imperativos. El problema es que estos lenguajes no son suficientemente genéricos, pues están orientados fundamentalmente a acceso a bases de datos.

  3. Lenguajes de muy alto nivel.
    HOPE, ML, MIRANDA y OBJ por ejemplo, sí podrían usarse como lenguajes de especificación, pero el problema reside en la distancia existente entre los conceptos utilizados por el lenguaje y los que habitualmente se utiliza en la especificación.

Abstracción de datos

Desde 1977, fecha en la que se acuñó el nombre, la abstracción de datos es un concepto que se ha convertido en una revolución de la programación por el avance que ha supuesto en la evolución hacia la especificación.

La idea principal de la abstracción de datos es la siguiente: Es decir, el propósito es permitir el uso de los datos sin conocer los detalles de implementación, es decir, ni la forma de almacenamiento de los datos ni los algoritmos específicos utilizados para su acceso o manipulación.

Respecto a los tipos de datos: Las ventajas de la abstracción de datos para la especificación son: Y las desventajas son:
Automatización de la especificación

Hay una tendencia creciente hacia la automatización de una especificación.

El ciclo de vida clásico está siendo alterado por nuevos enfoques que tratan de automatizar una cierta especificación original, manteniendo la semántica. Esta tendencia se hace más evidente por la crisis del modelo en cascada para el desarrollo del software.

El modelo de desarrollo en cascada es de tipo secuencial, en donde cada fase se realiza tras la anterior: especificación, análisis, diseño, codificación y pruebas. Adolece de graves inconvenientes que dificultan la automatización completa del ciclo de vida [Balzer, 1983] [Wegner, 1984]:
  1. Discontinuidad en el proceso de desarrollo.
    En las etapas iniciales del ciclo de vida, lo que se especifica es una abstracción más o menos informal de lo que se desea realizar. Esta abstracción se refina progresivamente hasta que se transforma en un cierto punto en código fuente. Este código fuente se puede considerar una especificación operacional, que indica cómo debe llevarse a cabo. Hay por lo tanto una discontinuidad en el proceso, que ocasiona que no se pueda verificar si el código fuente resultante se ajusta o no a la especificación inicial.

  2. Mantenimiento a bajo nivel.
    El mantenimiento hay que realizarlo a bajo nivel, en el código fuente, es decir, en la implementación. Esto constituye un problema, pues se rompe facilmente la relación entre la especificación y el código fuente, lo que puede conducir a errores.

Sistemas de Automatización de la Especificación

Generadores de programas

Ofrecen al usuario la posibilidad de desarrollar programas sin conocer prácticamente nada sobre lenguajes. Son los productos CASE (Computer Aided Software Engineering), muchos de los cuales tienen la posibilidad de generar código fuente. Estas herramientas tuvieron su auge a principios de los años 1990s y estaban orientadas a ordenadores centrales (mainframes). Con la irrupción de los ordenadores personales estos productos han dejado de utilizarse.


Metaprogramación

La metaprogramación (un concepto reflexivo) es “programar programas”, es decir, el desarrollo de programas que generan programas. Los pasos son:
  1. Se escribe la aplicación A en un determinado lenguaje.
  2. Un programa conversor o traductor C genera el programa B.
  3. Se ejecuta el programa B.
Las ventajas de la metaprogramación son: Y las desventajas son:
Programación transformacional

Puesto que existen dificultades para lograr a la vez los objetivos de claridad y eficiencia, la programación transformacional separa estos dos aspectos y los aborda como tareas independientes.

Sus pioneros fueron Burstall y Durlington, en 1977. Estos autores sugieren que el programador debe diseñar y escribir un programa con el único propósito de que sea inteligible y claro, sin considerar en ningún momento la eficiencia. A continuación el programa es sucesivamente transformado en versiones más y más eficientes del original, sin alterar su significado.

El programa construido inicialmente es una especificación que describe el problema a resolver, de la manera más clara posible. Además, su validez se puede demostrar antes de que se apliquen las transformaciones, siendo el resultado final igualmente válido.

Este modelo ha estado disponible sólo para pequeños productos y en dominios limitados: hojas de cálculo, aplicaciones de gestión con 4GLs, etc.

La especificación operacional se transforma sucesivamente, mediante un proceso mecanizado, hasta que se obtiene un código fuente optimizado. En cada etapa de refinamiento debe existir un proceso de verificación de la consistencia (la no pérdida de la semántica) o de la emulación de la ejecución.

El problema es la transformación de una especificación ejecutable en código eficiente, tarea que se supone compleja, debido a que:
  1. Se sabe poco acerca de como influyen las optimizaciones realizadas en la especificación sobre la implementación.

  2. El espacio de posibles implementaciones es demasiado extenso.

Especificación operacional

El modelo de especificación operacional [Wegner, 1984] es un nuevo paradigma basado en la programación transformacional. Consiste en definir un sistema mediante un lenguaje de especificación, con su semántica y sintaxis formal, de tal forma que la especificación resultante se pueda ejecutar, como programa, aunque sea de manera poco eficiente. Este modelo es el ideal, es decir, que la especificación sea directamente ejecutable, sin necesidad de ninguna transformación.

Las ventajas de la especificación ejecutable son:
MENTAL como Lenguaje Formal de Especificación

MENTAL cumple las condiciones para ser un lenguaje formal de especificación:

Bibliografía